#ifndef __STARTUP_H__
#define __STARTUP_H__
#include <cstdint>
extern "C"
{
	__weak void Reset_Handler(void);
	__weak void NMI_Handler(void);
	__weak void HardFault_Handler(void);
	__weak void MemManage_Handler(void);
	__weak void BusFault_Handler(void);
	__weak void UsageFault_Handler(void);
	__weak void SVC_Handler(void);
	__weak void DebugMon_Handler(void);
	__weak void PendSV_Handler(void);
	__weak void SysTick_Handler(void);
	/***********************************************************/
	__weak void WWDG_IRQHandler(void);
	__weak void PVD_IRQHandler(void);
	__weak void TAMPER_IRQHandler(void);
	__weak void RTC_IRQHandler(void);
	__weak void FLASH_IRQHandler(void);
	__weak void RCC_IRQHandler(void);
	__weak void EXTI0_IRQHandler(void);
	__weak void EXTI1_IRQHandler(void);
	__weak void EXTI2_IRQHandler(void);
	__weak void EXTI3_IRQHandler(void);
	__weak void EXTI4_IRQHandler(void);
	__weak void DMA1_Channel1_IRQHandler(void);
	__weak void DMA1_Channel2_IRQHandler(void);
	__weak void DMA1_Channel3_IRQHandler(void);
	__weak void DMA1_Channel4_IRQHandler(void);
	__weak void DMA1_Channel5_IRQHandler(void);
	__weak void DMA1_Channel6_IRQHandler(void);
	__weak void DMA1_Channel7_IRQHandler(void);
	__weak void ADC1_2_IRQHandler(void);
	__weak void USB_HP_CAN1_TX_IRQHandler(void);
	__weak void USB_LP_CAN1_RX0_IRQHandler(void);
	__weak void CAN1_RX1_IRQHandler(void);
	__weak void CAN1_SCE_IRQHandler(void);
	__weak void EXTI9_5_IRQHandler(void);
	__weak void TIM1_BRK_IRQHandler(void);
	__weak void TIM1_UP_IRQHandler(void);
	__weak void TIM1_TRG_COM_IRQHandler(void);
	__weak void TIM1_CC_IRQHandler(void);
	__weak void TIM2_IRQHandler(void);
	__weak void TIM3_IRQHandler(void);
	__weak void TIM4_IRQHandler(void);
	__weak void I2C1_EV_IRQHandler(void);
	__weak void I2C1_ER_IRQHandler(void);
	__weak void I2C2_EV_IRQHandler(void);
	__weak void I2C2_ER_IRQHandler(void);
	__weak void SPI1_IRQHandler(void);
	__weak void SPI2_IRQHandler(void);
	__weak void USART1_IRQHandler(void);
	__weak void USART2_IRQHandler(void);
	__weak void USART3_IRQHandler(void);
	__weak void EXTI15_10_IRQHandler(void);
	__weak void RTCAlarm_IRQHandler(void);
	__weak void USBWakeUp_IRQHandler(void);
	/***************************************************************/
	void SystemInit(void);
	void __main(void);
#if defined(__MICROLIB)

#else
	void __user_initial_stackheap(void);
#endif
};
typedef struct
{
    std::uint32_t _sp;
    void(*isr[58])(void);
}IsrVector_t;
#define Stack_Size 0x00000250
#define Heap_Size 0x00000200
#define __initial_sp ((std::uint32_t)Stack_Mem+Stack_Size)
#define __heap_base ((std::uint32_t)Heap_Mem)
#define __heap_limit (__heap_base+(std::uint32_t)sizeof(Heap_Mem))
#define __Vectors_Size sizeof(__Vectors)
#define __Vectors_End ((std::uint32_t)__Vectors+__Vectors_Size)
extern const IsrVector_t __Vectors[] __attribute__((section("RESET")));
extern std::uint8_t Stack_Mem[Stack_Size] __attribute__((section("STACK")));
extern std::uint8_t Heap_Mem[Heap_Size] __attribute__((section("HEAP")));
#define CODE_SECTION __attribute__((section(".text")))
#endif
